#pragma once
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cerrno>
#include <cassert>
#include <cstdarg>
#include <ctime>

#define DEBUG 0
#define NOTICE 1
#define WARNINGS 2
#define FATAL 3

const char *log_level[] = {"DEBUG", "NOTICE", "WARNINGS", "FATAL"};

void logMessage(int level, const char *format, ...)
{
    assert(level >= DEBUG);
    assert(level <= FATAL);

    char *name = getenv("USER");

    char logInfo[1024];
    va_list ap;           // ap -> char* , va_list 类型变量，用于存储可变参数列表
    va_start(ap, format); // 初始化 va_list

    vsnprintf(logInfo, sizeof(logInfo) - 1, format, ap); // 格式化日志信息
    FILE *out = (level == FATAL) ? stderr : stdout;      // 根据日志级别选择输出流

    fprintf(out, "%s | %u | %s | %s\n",
            log_level[level],
            (unsigned int)time(nullptr),
            name == nullptr ? "unknow" : name,
            logInfo);

    va_end(ap); // ap = NULL，结束可变参数的获取，清理 va_list
}